<?php
namespace Kuoqi\Html\Template;
/**
 * Class Tree
 * @package Kuoqi\Html\Template
 * User kuoqi
 * Datetime 2022/3/1 18:57
 * Remark 本模块基于KuoqiJs与KuoqiApp进行开发
 */
class Tree{

    /**
     * @var array
     * User kuoqi
     * Datetime 2022/3/1 18:58
     * Remark 输入数据信息
     */
    public $input_data = array();

    /**
     * @var int
     * User kuoqi
     * Datetime 2022/3/1 19:02
     * Remark 顶级ID
     */
    public $input_topid = 0;

    /**
     * @var string
     * User kuoqi
     * Datetime 2022/3/1 19:00
     * Remark id
     */
    public $input_id = 'id';

    /**
     * @var string
     * User kuoqi
     * Datetime 2022/3/1 19:00
     * Remark 轮回ID
     */
    public $input_pid = 'pid';


    /**
     * @var string
     * User kuoqi
     * Datetime 2022/3/1 19:03
     * Remark 输出的数据信息
     */
    public $stream = '';

    /**
     * Tree constructor.
     * 初始化
     */
    public function __construct($data = array()){
        $this->input_data = $data;
    }

    //将数据转换为菜单
    /*
     * li><a>基础信息</a>
            <ul>
                <li><a data-id="6" data-title="常规列表" data-url="./list.html">常规列表</a></li>
                <li><a data-id="8" data-title="编辑页面" data-url="./edit.html">编辑页面</a></li>
                <li><a data-id="7" data-title="常规详情" data-url="./detail.html">常规详情</a></li>
            </ul>
        </li>
     * */
    public function toMenu($pid = 0){
        $stream = '';
        if(!is_array($this->input_data)){ return '';}
        foreach($this->input_data as $item){
            if($item[$this->input_pid]==$pid){
                //这里判定使用哪种方式
                $hassub = -1;
                foreach($this->input_data as $sitem){
                    if($sitem[$this->input_pid]==$item[$this->input_id]){
                        //有子页面的情况
                        $hassub = $item[$this->input_id];break;
                    }
                }
                if($hassub==-1){
                    //没有子页面
                    $stream .= sprintf('<li><a data-id="%s" data-title="%s" data-url="%s">%s</a></li>'
                        ,$item[$this->input_id]
                        ,$item['name']
                        ,url($item['ctl'].'/'.$item['act'])
                        ,'<span>'.$item['name'].'</span>'
                    );
                }else{
                    //有子页面
                    $stream .= sprintf('<li><a>%s</a>%s</li>'
                        ,$item['name']
                        ,'<ul>'.$this->toMenu($hassub).'</ul>'
                    );
                }
            }
        }
        return $stream;
    }


    public function toMenuWithHref($pid = 0){
        $stream = '';
        if(!is_array($this->input_data)){ return '';}
        foreach($this->input_data as $item){
            if($item[$this->input_pid]==$pid){
                //这里判定使用哪种方式
                $hassub = -1;
                foreach($this->input_data as $sitem){
                    if($sitem[$this->input_pid]==$item[$this->input_id]){
                        //有子页面的情况
                        $hassub = $item[$this->input_id];break;
                    }
                }
                if($hassub==-1){
                    //没有子页面
                    $stream .= sprintf('<li><a data-id data-url data-title="%s" href="%s">%s</a></li>'
                        ,$item['name']
                        ,url($item['ctl'].'/'.$item['act'])
                        ,'<span>'.$item['name'].'</span>'
                    );
                }else{
                    //有子页面
                    $stream .= sprintf('<li><a>%s</a>%s</li>'
                        ,$item['name']
                        ,'<ul>'.$this->toMenuWithHref($hassub).'</ul>'
                    );
                }
            }
        }
        return $stream;
    }

    /**
     * @param int $pid
     * @return string
     */
    public function toMenuWithIcon($pid = 0){
        $stream = '';
        if(!is_array($this->input_data)){ return '';}
        foreach($this->input_data as $item){
            if($item[$this->input_pid]==$pid){
                //这里判定使用哪种方式
                $hassub = -1;
                foreach($this->input_data as $sitem){
                    if($sitem[$this->input_pid]==$item[$this->input_id]){
                        //有子页面的情况
                        $hassub = $item[$this->input_id];break;
                    }
                }
                if($hassub==-1){
                    //没有子页面
                    $stream .= sprintf('<li><a data-id="%s" data-title="%s" data-url="%s"><i class="icon %s"></i><span>%s</span></a></li>'
                        ,$item[$this->input_id]
                        ,$item['name']
                        ,url($item['ctl'].'/'.$item['act'])
                        ,$item['icon']
                        ,'<span>'.$item['name'].'</span>'
                    );
                }else{
                    //有子页面
                    $stream .= sprintf('<li><a><i class="icon %s"></i><span>%s</span></a>%s</li>'
                        ,$item['icon']
                        ,$item['name']
                        ,'<ul>'.$this->toMenuWithIcon($hassub).'</ul>'
                    );
                }
            }
        }
        return $stream;
    }

    /**
     * 转换为复选项菜单
     * @param int $pid
     * @return string
     * User kuoqi
     * Datetime 2022/4/7 9:58
     * Remark
     */
    public function toCheckbox($pid = 0,$ids = array()){
        $stream = '';
        if(!is_array($this->input_data)){ return '';}
        foreach($this->input_data as $item){
            if($item[$this->input_pid]==$pid){
                //这里判定使用哪种方式
                $hassub = -1;
                foreach($this->input_data as $sitem){
                    if($sitem[$this->input_pid]==$item[$this->input_id]){
                        //有子页面的情况
                        $hassub = $item[$this->input_id];break;
                    }
                }
                $hasChecked = 0;
                foreach($ids as $it){
                    if($it==$item[$this->input_id]){
                        $hasChecked = 1;
                        break;
                    }
                }
                if($hassub==-1){
                    //没有子页面
                    $stream .= sprintf('<div class="card card-incheckbox"><label class="label"><input %s type="checkbox" name="ids[]" value="%s" data-init="true" /><span >%s</span></label></div>'
                        ,$hasChecked?'checked="checked"':''
                        ,$item[$this->input_id]
                        ,$item['name']
                    );
                }else{
                    //有子页面
                    $stream .= sprintf('<div class="card card-checkbox"><label class="label"><input %s type="checkbox" name="ids[]" value="%s" data-init="true" /><span >%s</span></label>%s</div>'
                        ,$hasChecked?'checked="checked"':''
                        ,$item[$this->input_id]
                        ,$item['name']
                        ,'<div class="card card-checkbox mgl-15">'.$this->toCheckbox($hassub,$ids).'</div>'
                    );
                }
            }
        }
        return $stream;
    }

    /**
     * 获取selectoption的列表
     * @param int $defval
     * @param int $pid
     * @param int $lev
     * @return string
     */
    public function toOptions($defval = 0,$pid = 0,$lev = 0){
        $this->stream = '';
        if(!is_array($this->input_data)){ return '';}
        $this->toOptionsConts($defval,$pid,$lev);
        return $this->stream;
    }

    /**
     * 获取selectoption的列表的内置方法
     * @param int $defval
     * @param int $pid
     * @param int $lev
     */
    private function toOptionsConts($defval = 0,$pid = 0,$lev = 0){
        $lev ++;
        foreach($this->input_data as $item){
            if($item[$this->input_pid]==$pid){
                $dpstr = '';
                for($i=1;$i<$lev;$i++){
                    $dpstr .= '==>';
                }
                $this->stream .= sprintf('<option %s value="%s">%s%s</option>'
                    ,($item['id']==$defval)?'selected="selected"':''
                    ,$item['id']
                    ,$dpstr
                    ,$item['name']
                );
                foreach ($this->input_data as $sitm){
                    if($sitm['pid']==$item['id']){
                        $this->toOptionsConts($defval,$item['id'],$lev);
                        break;
                    }
                }
            }
        }
    }

}